package com.vip.jwt.common.utils.xcx.wx;

import cn.hutool.http.HttpRequest;
import com.vip.jwt.common.exception.MyException;
import com.vip.jwt.common.utils.ConvertUtil;
import com.vip.jwt.common.utils.sign.WXSignUtil;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;

import java.util.*;

/**
 * 微信支付工具类
 */
public class WXPayUtil {

    @Getter
    private static String APP_ID;

    @Getter
    private static String APP_SECRET;

    @Getter
    private static String MCH_ID;

    @Getter
    private static String API_SECRET;

    @Getter
    private static String NOTIFY_URL;

    @Value("${wx-xcx-appid}")
    public void setAppId(String appId) {
        APP_ID = appId;
    }

    @Value("${wx-xcx-appsecret}")
    public void setAppSecret(String appSecret) {
        APP_SECRET = appSecret;
    }

    @Value("${wx-pay-mchid}")
    public void setMchId(String mchId) {
        MCH_ID = mchId;
    }

    @Value("${wx-pay-apisecret}")
    public void setApiSecret(String apiSecret){
        API_SECRET = apiSecret;
    }

    @Value("${wx-pay-notifyurl}")
    public void setNotifyUrl(String notifyUrl){
        NOTIFY_URL = notifyUrl;
    }

    /**
     * 统一下单
     * @param body 商品描述（例如：腾讯充值中心-QQ会员充值）
     * @param totalFee 金额
     * @param openid 用户标识
     * @param ip 用户ip地址
     * @return
     */
    public static String unifiedOrder(String body,String totalFee,String openid,String ip){
        String url = "https://api2.mch.weixin.qq.com/pay/unifiedorder";
        Map<String,String> params = new HashMap<>(16);
        params.put("appid",APP_ID);
        // 商户号
        params.put("mch_id",MCH_ID);
        // 随机字符串
        params.put("nonce_str", WXSignUtil.getNonceStr());
        // 签名类型（选填）
        // params.put("sign_type",getSignType());
        // 商品描述
        params.put("body",body);
        // 商品详情（选填）
        // params.put("detail","");
        // 附加数据（选填）
        // params.put("tattach","");
        // 商户订单号
        params.put("out_trade_no", WXSignUtil.getOutTradeNo());
        // 标价金额
        params.put("total_fee",totalFee);
        // 终端ID
        params.put("spbill_create_ip",ip);
        // 交易起始时间（选填）
        // params.put("time_start","");
        // 交易结束时间（选填）
        // params.put("time_expire","");
        // 通知地址
        params.put("notify_url",NOTIFY_URL);
        // 交易类型
        params.put("trade_type","JSAPI");
        // 商品ID（选填）
        // params.put("product_id","");
        // 用户标识
        params.put("openid",openid);
        // 场景信息（选填）
        // params.put("scene_info","");
        String sign = WXSignUtil.generateSignature(params, API_SECRET);
        params.put("sign",sign);
        String xmlStr;
        try {
            xmlStr = ConvertUtil.mapToXml(params);
        } catch (Exception e) {
            throw new MyException("Map转换Xml数据失败");
        }
        return HttpRequest.post(url).header("Content-Type","text/xml").body(xmlStr).execute().body();
    }

    /**
     *
     * @param prepayId prepayId在统一下单接口返回的数据里面
     * @return
     */
    public static Map<String,String> getOrderInfo(String prepayId,String nonceStr){
        Map<String,String> params = new HashMap<>(16);
        params.put("appId",APP_ID);
        params.put("timeStamp", WXSignUtil.getTimeStamp());
        params.put("nonceStr",nonceStr);
        params.put("package","prepay_id=" + prepayId);
        //数据包（统一下单接口返回的 prepay_id 参数值，格式如：prepay_id=xx）
        params.put("signType", WXSignUtil.getSignType());
        String paySign = WXSignUtil.generateSignature(params, API_SECRET);
        params.put("paySign",paySign);
        return params;
    }

}
